package main

import (
	"log"
	"runtime"
	"yunpan/app"
	"yunpan/db"
	"yunpan/logger"
	"yunpan/middleware"
	"yunpan/pool"
	"yunpan/router"
	"yunpan/store/ceph"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

func main() {
	// 初始化日志系统
	logger.InitLogger()
	defer logger.Log.Sync()
	defer logger.Api.Sync()

	hashPool := pool.NewHashWorkerPool(runtime.NumCPU(), 100) // CPU密集型任务使用CPU核心数
	dbPool := pool.NewDBWorkerPool(10, 1000)                  // IO密集型可以多一些
	cephPool := pool.NewCephWorkerPool(20, 1000)              // IO密集型可以多一些

	// 启动工作池
	hashPool.Start()
	dbPool.Start()
	cephPool.Start()

	// 确保程序退出时关闭工作池
	defer hashPool.Stop()
	defer dbPool.Stop()
	defer cephPool.Stop()

	if err := db.InitDB(); err != nil {
		log.Fatalf("Failed to initialize database: %v", err)
	}

	ceph.GetCephAdminConn()

	// 设置为发布模式
	gin.SetMode(gin.ReleaseMode)

	// 创建一个新的 Gin 路由器
	r := gin.New()

	// 使用CORS中间件
	r.Use(middleware.Cors())
	r.Use(gin.Recovery())
	r.Use(middleware.Logger())
	// 添加一个测试路由
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "pong",
		})
	})

	// 初始化应用上下文
	app.InitContext(hashPool, dbPool, cephPool)
	ctx := app.GetContext()
	// 设置路由
	router.SetupRoutes(r, ctx.DBPool)

	logger.Info("Server starting", zap.String("port", ":9091"))

	// 启动 HTTP 服务器
	if err := r.Run(":9091"); err != nil {
		logger.Fatal("Server startup failed",
			zap.Error(err),
		)
	}
}
